# 函数：具有独立功能的代码块，封装之后为别人调用提供服务
# 作用：减少代码的重复编写，逻辑独立的代码进行封装方便使用
# 步骤:
# 定义函数：功能封装好
# 调用函数：享受封装后的成果

# 函数使用
"""
定义函数：封装独立的功能
语法格式
def 函数名():
    函数封装的代码

注:
    def 是define的缩写，函数名尽量见名知义
    函数命名规则遵循标识符命名规范【下划线命名习惯】
调用函数：享受封装后的成果
语法格式:函数名()
注:
只定义函数，不调用函数，函数不执行
调用函数不能放在定义函数的上方（顺序执行规则）
"""

def demo():
    print("这是测试函数")

# 调用函数
# demo()
# 1、函数不调用，不会自动执行
# 2、调用函数必须放在定义函数的下方

"""
代码调试（debug）
> 目的：理解复杂代码的运行过程(代码的调试)
‐ 使用步骤
‐ 1.调试代码行号出添加**断点**（鼠标左键点击）
‐ 2.右键**debug运行**，使用快捷键单步执行查看
‐ 3.调试完毕后，在代码行号点击鼠标左键**取消断点**
‐ 快捷键
‐ **F8** Step Over: 单步执行代码, 会将函数调用看做是一行代码直接执行
‐ F7 Step Into: 单步执行代码, 遇到函数调用, 会进入到函数定义内部
### 3.3 函数文档注释
> 文档注释也叫多行注释
>
> 目的：对函数的解释说明，增强函数可读性
‐ 语法格式
def func():
函数封装的代码
...
"""
# 注:
# 函数注释一般写在定义函数的下方，使用三对双引号
# 函数调用处通过快捷键（ctrl+q）查看函数注释信息

# 参数作用：灵活性、重用性
# 参数：形参和实参
# 定义函数参数叫形参，调用函数参数叫实参

# 再构造数据进行验证
# num = 1 # 计数器
# # for i in login_data:
# #     # 获取账号密码
# #     phone = i.get("username")
# #     pwd = i.get("password")
# #     print(f"第{num}次测试")
# #     # 调用函数
# #     login(phone, pwd)
# #     num += 1 # 调用一次计数器增1

